package com.solution.admin.auth.dao.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Repository;

import com.solution.admin.auth.dao.UserDao;
import com.solution.admin.auth.entity.UserEntity;
import com.solution.common.dao.impl.BaseDaoImpl;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;

/**
 * 用户管理DAO实现
 * 
 * @author diwankang
 * @date 2017年4月12日 下午2:47:56
 */
@Repository
public class UserDaoImpl extends BaseDaoImpl<UserEntity> implements UserDao {
	
	/**
	 * 通过用户编码获取客户信息
	 * @param params
	 * @return
	 * @author: solin
	 * @date: 2017年10月31日 上午11:03:27
	 */
	@Override
	public UserEntity getUserByCode(String userCode) {
		return getSessionTemplate().selectOne(getStatement("getUserByCode"), userCode);
	}

	/**
	 * 获取登陆者信息
	 * @param params
	 * @return
	 * @exception/throws [异常类型][异常说明]
	 * @author diwankang
	 * @date 2017年4月13日 下午5:20:23
	 * @modify <scy> <2017年4月13日 下午5:20:23>
	 */
	@Override
	public UserEntity getUserByName(Map<String, Object> params) {
		return getSessionTemplate().selectOne(getStatement("getUserByName"), params);
	}

	/**
	 * 根据手机号码查询用户信息
	 * 
	 * @param params
	 * @return
	 * @author chenl
	 * @date 2017年5月9日 上午9:22:03
	 */
	@Override
	public UserEntity getUserInfor(Map<String, Object> params) {
		return getSessionTemplate().selectOne(getStatement("getUserInfor"), params);
	}

	/**
	 * 用用户信息表的唯一性验证封装类
	 * 主要用于验证用户名和手机号是否重复
	 * 如果查询数量>1 代表有两个
	 */
	@Override
	public int checkUserUnique(Map<String, Object> params) {
		int num = getSessionTemplate().selectOne(getStatement("listUniqueCount"), params);
		return num;
	}

	/**
	 * 保存用户信息
	 * 
	 * @param userEntity
	 * @return
	 * @exception/throws [异常类型][异常说明]
	 * @author diwankang
	 * @date 2017年4月12日 下午2:48:17
	 * @modify <scy> <2017年4月12日 下午2:48:17>
	 */
	@Override
	public long saveUser(UserEntity userEntity) {
		return super.insert(userEntity);
	}

	/**
	 * 分页查询用户信息
	 * 
	 * @param pageParam
	 *            分页对象
	 * @param user
	 *            分页参数
	 * @return PageBean 分页参数及数据
	 * @exception 无
	 * @author llp
	 * @date 2017年4月12日 下午2:47:41
	 */
	public PageBean listUser(PageParam pageParam, Map<String, Object> param) {
		return super.listPage(pageParam, param);
	}

	/**
	 * 更新用户
	 * 
	 * @param userEntity
	 * @return
	 * @exception/throws [异常类型][异常说明]
	 * @author diwankang
	 * @date 2017年4月12日 下午2:48:30
	 * @modify <scy> <2017年4月12日 下午2:48:30>
	 */
	@Override
	public int modifyUser(UserEntity userEntity) {
		return super.update(userEntity);
	}

	/**
	 * 批量插入用户与角色关联信息
	 * @param userRoleList
	 * @return
	 * @author diwankang
	 * @date 2017年4月14日 下午2:13:46
	 * @modify <scy> <2017年4月14日 下午2:13:46>
	 */
	@Override
	public int addUserRole(List<Map<String, Object>> userRoleList) {
		return getSessionTemplate().insert("insertUserRole", userRoleList);
	}

	/**
	 * 重置用户密码
	 * 
	 * @param user
	 *            用户实体
	 * @return Long 更新是否成功，>1代表更新成功
	 * @author llp
	 * @date 2017年4月12日 下午2:44:59
	 */
	public int updateUserPwd(UserEntity user) {
		return getSessionTemplate().update("resetUserPwd", user);
	}

	/**
	 * 根据手机号码重置用户密码
	 * 
	 * @param user
	 * @return Long 更新是否成功，>1代表更新成功
	 * @author chenl
	 * @date 2017年5月9日 上午8:58:29
	 */
	public int updateUserPwdByMobile(UserEntity user) {
		return getSessionTemplate().update("resetUserPwdByMobile", user);
	}

	/**
	 * 删除用户角色
	 * @param userId
	 * @return
	 * @author llp
	 * @date 2017年4月12日 下午2:44:59
	 */
	public int deleteUserRole( Long userId) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("userId", userId);
		return getSessionTemplate().delete(getStatement("deleteUserRole"), paramMap);
	}

	/**
	 * 插入用户角色
	 * 
	 * @param roleList
	 * @return
	 * @author llp
	 * @date 2017年4月12日 下午2:44:59
	 */
	public int insertUserRole( Long userId, List<Long> roleIds) {
		int result = 0;
		if (roleIds != null) {
			for (int i = 0; i < roleIds.size(); i++) {
				Long roleId = roleIds.get(i);
				HashMap<String, Object> paramMap = new HashMap<String, Object>();
				paramMap.put("userId", userId);
				paramMap.put("roleId", roleId);
				getSessionTemplate().insert(getStatement("insertUserRole"), paramMap);
				result++;
			}
		}
		return result;
	}

	@Override
	public int updateStatus(Long userId, Integer status) {
		HashMap<String, Object> paramMap = new HashMap<String, Object>();
		paramMap.put("id", userId);
		paramMap.put("status", status);
		return this.getSessionTemplate().update(this.getStatement("updateStatus"), paramMap);
	}

	/**
	 * 根据经销商编码获取经销商大区及公司的名称、编码
	 * @param dealerCodes
	 * @return
	 * @author xkl
	 * @date 2017年7月31日 下午3:41:05
	 */
	@Override
	public Map<String, Map<String, Object>> listCodeMapByCodes(List<String> dealerCodes) {
		return getSessionTemplate().selectMap(getStatement("listCodeMapByCodes"), dealerCodes, "dealerCode");
	}

	
	/**
	 * 根据用户类型获取用户信息
	 * @param param
	 * @return
	 * @author chenling
	 * @date 2017年8月1日 下午2:53:45
	 */
	@Override
	public List<UserEntity> getUserList( Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("getUserList"),param);
	}
	
	/**
	 * 获取业务员列表数据
	 * @param params
	 * @return
	 * @author: solin
	 * @date: 2017年10月20日 下午3:57:56
	 */
	@Override
	public List<UserEntity> getSalesmanList(Map<String, Object> param) {
		return getSessionTemplate().selectList(getStatement("getSalesmanList"), param);
	}
	
	/**
	 * 查询业务员列表
	 * @param paramMap
	 * @return
	 */
	@Override
	public List<UserEntity> listSalesmanForSelector(Map<String, Object> paramMap){
		return getSessionTemplate().selectList(getStatement("listSalesmanForSelector"), paramMap);
	}
	
	/**
	 * 逻辑删除用户
	 * @param id
	 * @return
	 */
	@Override
	public int logicDeleteUser(long id){
		return getSessionTemplate().update(getStatement("logicDeleteUser") , id);
	}
	
}
